<?php
/**
 * Modelo CRUD de M para N. Insere registros distribuídos em uma tabela principal e tabelas relacionadas
 * @author Emanuel Melo, Renato Lenz e Thiago Bezerra @ PC4 Team
 * @example Inserir um pacote com serviços e facilidades associados
 */
class PC4_Crud_M2Ns extends PC4_Crud_Upload2 {

	protected $tabelasN, $mRelacionado;
	protected $prefixo;
	
	/**
	 * Construtor
	 * @param $tabela
	 * @param $tabelasN array com os nomes das tabelas
	 * @param $caminho
	 * @param $uploads array (campo -> {tamMaximo, tipos, caminho})
	 * @param $prefixo
	 * @param $juncao -> REMOVIDO!!!
	 * @param $validacoes array (campo -> validacao)
	 */
	function __construct($tabela, $tabelasN = array(), $caminho = '', $uploads = array(), $prefixo = 'id_', $validacoes = array()) {
		parent::__construct($caminho, $tabela, $uploads, $validacoes);
		
		$this->tabelasN = (array) $tabelasN;
		$this->prefixo = $prefixo;
		
	}
	/**
	 * Recebe um array com os campos e insere na base de dados o novo registro
	 * @param array $umRegistro
	 * @return O id inserido ou um array com mensagens de erro
	 */
	function insere($registro) {
		foreach ($this->tabelasN as $tabelaN) {
			$rsRelacionados[$tabelaN] = (array)$registro[$tabelaN];
			unset($registro[$tabelaN]);
		}
		
		$idRegistro = parent::insere($registro);
		
		if (is_numeric($idRegistro)) {
			foreach ($rsRelacionados as $tabelaN => $rs) {
				if(!empty($rs)){
					foreach ($rs as &$r) {
						$r[$this->prefixo . $this->tabela] = $idRegistro;
					}
					$mRelacionado = new PC4_Crud_Abstrato($tabelaN);
					$mRelacionado->insereVarios($rs, '');
				}
			}
		}
		return $idRegistro;
	}
	/**
	 * 
	 * @param array $umRegistro
	 * @param int $id
	 * @return devolve um array de erros (nomeCampo/erro) para cada campo que não passou da validação 
	 */
	function edita($registro, $id) {
		foreach ($this->tabelasN as $tabelaN) {
			$rsRelacionados[$tabelaN] = (array)$registro[$tabelaN];
			unset($registro[$tabelaN]);
		}
				
		$erros = parent::edita($registro, $id);
		
		if (empty($erros)) {
			foreach ($rsRelacionados as $tabelaN => $rs) {
				$this->db->delete($tabelaN, array($this->prefixo . $this->tabela => $id));
				if(!empty($rs)){
					foreach ($rs as &$r) {
						$r[$this->prefixo . $this->tabela] = $id;
					}
					$mRelacionado = new PC4_Crud_Abstrato($tabelaN);
					$mRelacionado->insereVarios($rs, '');
				}
			}
		}
		return $erros;
	}
	/**
	 * Apaga um registro
	 * @param int $id
	 * @return int Linhas afetadas
	 */
	function apaga($id) {
		foreach ($this->tabelasN as $tabelaN) {
			$this->db->delete($tabelaN, array($this->prefixo . $this->tabela => $id));
		}
		return parent::apaga($id);
		
	}

}
?>